/**
 * 格式化日期
 * @param {Date|String|Number} time 日期对象、时间戳或日期字符串
 * @param {String} format 格式化模板，如'YYYY-MM-DD HH:mm:ss'
 * @returns {String} 格式化后的日期字符串
 */
export function formatDate(time, format = 'YYYY-MM-DD HH:mm:ss') {
  if (!time) {
    return ''
  }
  
  let date
  
  if (typeof time === 'object') {
    date = time
  } else {
    // 处理时间戳（10位或13位）或日期字符串
    if (typeof time === 'string' && /^\d+$/.test(time)) {
      time = parseInt(time)
    }
    
    if (typeof time === 'number' && time.toString().length === 10) {
      time = time * 1000
    }
    
    date = new Date(time)
  }
  
  const formatObj = {
    YYYY: date.getFullYear(),
    MM: date.getMonth() + 1,
    DD: date.getDate(),
    HH: date.getHours(),
    mm: date.getMinutes(),
    ss: date.getSeconds(),
    A: date.getHours() < 12 ? 'AM' : 'PM',
    a: date.getHours() < 12 ? 'am' : 'pm'
  }
  
  // 补零
  const padLeftZero = (str) => {
    return ('00' + str).substr(str.toString().length)
  }
  
  const timeStr = format.replace(/(YYYY|MM|DD|HH|mm|ss|A|a)/g, (match) => {
    let value = formatObj[match]
    if (match === 'YYYY') {
      return value.toString()
    }
    
    if (match === 'A' || match === 'a') {
      return value
    }
    
    return padLeftZero(value)
  })
  
  return timeStr
}

/**
 * 获取最近n天的日期范围
 * @param {Number} days 天数
 * @returns {Array} 包含开始日期和结束日期的数组
 */
export function getRecentDays(days) {
  const end = new Date()
  const start = new Date()
  start.setTime(start.getTime() - 3600 * 1000 * 24 * days)
  return [start, end]
}

/**
 * 计算两个日期之间的天数差
 * @param {Date} date1 日期1
 * @param {Date} date2 日期2
 * @returns {Number} 天数差
 */
export function getDaysDiff(date1, date2) {
  const time1 = date1.getTime()
  const time2 = date2.getTime()
  const diff = Math.abs(time1 - time2)
  return Math.floor(diff / (1000 * 60 * 60 * 24))
}

/**
 * 日期是否相同
 * @param {Date} date1 日期1
 * @param {Date} date2 日期2
 * @returns {Boolean} 是否相同
 */
export function isSameDay(date1, date2) {
  return date1.getFullYear() === date2.getFullYear() &&
         date1.getMonth() === date2.getMonth() &&
         date1.getDate() === date2.getDate()
} 